# Copyright (c) 2012, Peter Angyal <angyalp@gmail.com>
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of the <organization> nor the
#       names of its contributors may be used to endorse or promote products
#       derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import sys
import xml.etree.ElementTree as ET
from PyQt4 import QtGui, QtCore, QtSvg, QtXml

trackFile = "test-track-1.svg"
pathElemID = "IDTrackPath"

class PathDefinitionError(Exception):
    def __init__(self, value):
        self.value = value
        
    def __str__(self):
        return repr(self.value)

class TrackPath():
    def __init__(self, SVGDefString):
        # http://www.w3.org/TR/SVG/paths.html#DAttribute
        raise PathDefinitionError("unknown")


def loadPathDefinition(svgFileName, pathID):
    try:
        xmlTree = ET.parse(svgFileName)
    except ET.ParseError, v:
        row, column = v.position
        print "Track file error: ", row, ",", column, ": ", v
        return None
    
    rootElem = xmlTree.getroot()

    svgURI = "{http://www.w3.org/2000/svg}"
    searchStr = ".//"+svgURI+"path[@id='"+pathID+"']"

    pathElem = rootElem.find(searchStr)
    if pathElem is None:
        return None

    pathDefString = pathElem.attrib['d']
    return pathDefString

def loadTrackPath(svgFileName):
    pathDefString = loadPathDefinition(svgFileName, pathElemID)

    if pathDefString is None:
        return None
    
    try:
        trackPath = TrackPath(pathDefString)
    except PathDefinitionError as e:
        print "Invalid path definition: ", e
        return None

    return trackPath

class MainWidget(QtGui.QWidget):
    
    def __init__(self):
        super(MainWidget, self).__init__()
        
        self.initUI()
        
    def initUI(self):
        self.svgRenderer = QtSvg.QSvgRenderer()
        if not self.svgRenderer.load(trackFile):
            QtGui.QMessageBox.warning(self, "Warning", "Unable to open file: " + trackFile)

            exit()

        trackPath = loadTrackPath(trackFile)
        if trackPath is None:
            QtGui.QMessageBox.warning(self, "Warning", "Unable to parse track path from file: " + trackFile)

            exit()
            
            
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('F1 Live Timing')
        self.show()

    def paintEvent(self, event):
        qp = QtGui.QPainter()
        qp.begin(self)
        self.svgRenderer.render(qp)
        qp.end()
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main() 
